package controlador;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import vista.BotonObservador;
import vista.Mensaje;
import javax.swing.JTextField;
import modelo.Modelo;
import modelo.funciones.*;

public class CreadorDeFuncion implements ActionListener{
	
	private Modelo modelo;
	private Parseador parser = new Parseador();
	private FabricaMetodosNumericos fabrica;
	
	public CreadorDeFuncion(Modelo modelo,FabricaMetodosNumericos fabrica)
	{
		this.setModelo(modelo);
		this.setFabricaMetodosNumericos(fabrica);
	}

	private void cartelFuncionInvalida(){
		@SuppressWarnings("unused")
		Mensaje mensaje=new Mensaje("La funcion no ha sido ingresada" +
				" correctamente");
	}
	
	public void actionPerformed(ActionEvent e) {
		if (e.getSource() instanceof JTextField)
		this.crearFuncion(((JTextField)e.getSource()).getText());
		else this.destruirFuncion(((BotonObservador)e.getSource()).getFuncion());
	}
	
	public void crearFuncion(String texto){
		try {
			String expresionParseada = parser.parsear(texto);
			Funcion funcionNueva = parser.f(expresionParseada, 1);
			funcionNueva.setMetodoParaDerivar(this.getFabrica().getMetodoParaDerivar());
			funcionNueva.setMetodoParaIntegrar(this.getFabrica().getMetodoParaIntegrar());
			funcionNueva.setMetodoParaEncontrarMaximo(this.getFabrica().getMetodoParaEncontrarMaximo());
			funcionNueva.setMetodoParaEncontrarMinimo(this.getFabrica().getMetodoParaEncontrarMinimo());
			this.getModelo().agregarFuncion(funcionNueva, "f(x)="+texto);
		}catch (Exception e){
			this.cartelFuncionInvalida();
		}
	}
	
	public void destruirFuncion(String funcion){
		if (funcion!=null)
		this.getModelo().sacarFuncion(funcion);
	}
	
	public void setModelo(Modelo modelo){
		this.modelo=modelo;
	}
	
	public Modelo getModelo(){
		return this.modelo;
	}
	
	public FabricaMetodosNumericos getFabrica(){
		return this.fabrica;
	}
	
	public void setFabricaMetodosNumericos(FabricaMetodosNumericos fabrica){
		this.fabrica=fabrica;
	}

}
